import demo2.Order;
import demo2.state.OrderState;
import demo2.state.OrderStateHandler;
import demo2.Result;

import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 状态模式
 * 允许一个对象在其内部状态改变时改变他的行为，对象看起来似乎修改了他的类。
 * 其别名为状态对象（Object for States），状态模式是一种对象行为型行为模式。
 * @author ZhouWeiBo
 * @create 2022/6/6
 */
public class App {

    /**
     * ------------------------------------ 以 下 为 D E M O  1 --------------------------------------------------
     */
    //public static void main(String[] args) {
    //    People people = new People();
    //    people.setName("小虎");
    //    people.setState(1);
    //    StateHandler stateHandler = new StateHandler();
    //    stateHandler.doState(people);
    //}

    /**
     * ------------------------------------ 以 下 为 D E M O  2 --------------------------------------------------
     */
    public static void main(String[] args) {
        /* 模仿从数据库获取数据的操作 */
        Order order = getOrderById(1L);
        System.out.println(order);
        OrderStateHandler stateHandler = new OrderStateHandler();
        /* 获取当前订单状态对象 */
        OrderState orderState = stateHandler.stateHandler(order);
        /* 以下操作根据不同的Controller调用不同的状态扭转方法 */
        Result result = orderState.finish(order);
        /* 输出结果 */
        System.out.println(result);
    }



    /**
     * 模仿数据库操作
     * @return
     */
    public static Order getOrderById(Long id){
        Map<Long,Order> orders = new ConcurrentHashMap<>();
        for (long i = 1; i < 10 ;i ++){
            Order order = new Order();
            order.setId(i);
            order.setOrderName("第" + i + "订单");
            order.setState(new Random().nextInt(4));
            orders.put(i,order);
        }
        return orders.get(id);
    }
}
